﻿// 语法分析-递归.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <stdio.h>

const int MAX_SIZE = 4096;
char buffer[4096];
char* ptr = buffer;

char output[100][40];
int o_ptr = -1;

void get_str();
void proc_E();
void proc_T();
void proc_F();
void error();
int is_num();

int main()
{
	get_str();
	proc_E();
	if (*ptr != '\0')
		error();
	printf("succeed!\n");
	for (int i = 0; i <= o_ptr; i++)
		printf("%d: %s\n", i, output[i]);
	return 0;
}

void get_str() {
	int i = 0;
	while (i < MAX_SIZE - 1) {
		char current;
		scanf("%c", &current);
		if (current == '\n') {
			buffer[i] = '\0';
			return;
		}
		else {
			buffer[i] = current;
			i++;
		}
	}
	printf("exceed the maximum!\n");
	exit(1);
}

void proc_E() {
	o_ptr++;
	static int c_ptr;
	c_ptr = o_ptr;
	if (o_ptr >= 100) {
		printf("exceed the maximum!\n");
		exit(1);
	}
	int s_ptr = 0;
	output[c_ptr][s_ptr] = 'E';
	s_ptr++;
	output[c_ptr][s_ptr] = ' ';
	s_ptr++;
	output[c_ptr][s_ptr] = '-';
	s_ptr++;
	output[c_ptr][s_ptr] = '>';
	s_ptr++;
	output[c_ptr][s_ptr] = ' ';
	s_ptr++;
	output[c_ptr][s_ptr] = 'T';
	s_ptr++;
	proc_T();
	while (*ptr == '+' || *ptr == '-') {
		output[c_ptr][s_ptr] = *ptr;
		s_ptr++;
		output[c_ptr][s_ptr] = 'T';
		s_ptr++;
		ptr++;
		proc_T();
	}
	output[c_ptr][s_ptr] = '\0';
	return;
}

void proc_T() {
	o_ptr++;
	static int c_ptr;
	c_ptr = o_ptr;
	if (o_ptr >= 100) {
		printf("exceed the maximum!\n");
		exit(1);
	}
	int s_ptr = 0;
	output[c_ptr][s_ptr] = 'T';
	s_ptr++;
	output[c_ptr][s_ptr] = ' ';
	s_ptr++;
	output[c_ptr][s_ptr] = '-';
	s_ptr++;
	output[c_ptr][s_ptr] = '>';
	s_ptr++;
	output[c_ptr][s_ptr] = ' ';
	s_ptr++;
	output[c_ptr][s_ptr] = 'F';
	s_ptr++;
	proc_F();
	while (*ptr == '*' || *ptr == '/') {
		output[c_ptr][s_ptr] = *ptr;
		s_ptr++;
		output[c_ptr][s_ptr] = 'F';
		s_ptr++;
		ptr++;
		proc_F();
	}
	output[c_ptr][s_ptr] = '\0';
	return;
}

void proc_F() {
	o_ptr++;
	static int c_ptr;
	c_ptr = o_ptr;
	if (o_ptr >= 100) {
		printf("exceed the maximum!\n");
		exit(1);
	}
	int s_ptr = 0;
	output[c_ptr][s_ptr] = 'F';
	s_ptr++;
	output[c_ptr][s_ptr] = ' ';
	s_ptr++;
	output[c_ptr][s_ptr] = '-';
	s_ptr++;
	output[c_ptr][s_ptr] = '>';
	s_ptr++;
	output[c_ptr][s_ptr] = ' ';
	s_ptr++;
	if (*ptr == '(') {
		output[c_ptr][s_ptr] = *ptr;
		s_ptr++;
		output[c_ptr][s_ptr] = 'E';
		s_ptr++;
		output[c_ptr][s_ptr] = ')';
		s_ptr++;
		ptr++;
		proc_E();
		if (*ptr == ')') 
			ptr++;
		else error();
	}
	else if (is_num() == 0) error();
	else {
		output[c_ptr][s_ptr] = 'n';
		s_ptr++;
		output[c_ptr][s_ptr] = 'u';
		s_ptr++;
		output[c_ptr][s_ptr] = 'm';
		s_ptr++;
	}
	output[c_ptr][s_ptr] = '\0';
	return;
}

int is_num() {
	o_ptr++;
	static int c_ptr;
	c_ptr = o_ptr;
	if (o_ptr >= 100) {
		printf("exceed the maximum!\n");
		exit(1);
	}
	int s_ptr = 0;
	output[c_ptr][s_ptr] = 'n';
	s_ptr++;
	output[c_ptr][s_ptr] = 'u';
	s_ptr++;
	output[c_ptr][s_ptr] = 'm';
	s_ptr++;
	output[c_ptr][s_ptr] = ':';
	s_ptr++;
	output[c_ptr][s_ptr] = ' ';
	s_ptr++;
	if ('0' > *ptr || *ptr > '9') {
		output[c_ptr][s_ptr] = '\0';
		return 0;
	}
	while ('0' <= *ptr && *ptr <= '9') {
		output[c_ptr][s_ptr] = *ptr;
		s_ptr++;
		ptr++;
	}
	if (*ptr == '.') {
		output[c_ptr][s_ptr] = *ptr;
		s_ptr++;
		ptr++;
		if ('0' > *ptr || *ptr > '9') {
			output[c_ptr][s_ptr] = '\0';
			return 0;
		}
		while ('0' <= *ptr && *ptr <= '9') {
			output[c_ptr][s_ptr] = *ptr;
			s_ptr++;
			ptr++;
		}
	}
	if (*ptr == 'E') {
		output[c_ptr][s_ptr] = *ptr;
		s_ptr++;
		ptr++;
	}
	else {
		output[c_ptr][s_ptr] = '\0';
		return 1;
	}
	if (*ptr == '+' || *ptr == '-') {
		output[c_ptr][s_ptr] = *ptr;
		s_ptr++;
		ptr++;
	}
	if ('0' > *ptr || *ptr > '9') {
		output[c_ptr][s_ptr] = '\0';
		return 0;
	}
	while ('0' <= *ptr && *ptr <= '9') {
		output[c_ptr][s_ptr] = *ptr;
		s_ptr++;
		ptr++;
	}
	output[c_ptr][s_ptr] = '\0';
	return 1;
}

void error() {
	printf("!!!error!!!");
	exit(1);
}